#ifndef __W25QXX_H__
#define __W25QXX_H__

#include "gpio.h"
#include "SpiInterface.h"
#include <stdlib.h>

#define W25QXX_OK 0x00
#define W25QXX_PAGE_WRITE_ERROR 0x01
#define W25QXX_BEYOND_CAPACITY 0x02

#define W25Q64ID 0xEF16



typedef struct W25Qxx W25QxxTypeDef;





/* 函数声明 */

// 1.初始化W25QXX
W25QxxTypeDef* W25Qxx( SPI_HandleTypeDef* spi, GPIO_TypeDef* csPort, uint16_t csPin );
// 2.片选使能
void W25QxxCsEnable( W25QxxTypeDef* w25qxx );
// 3.片选禁用
void W25QxxCsDisable( W25QxxTypeDef* w25qxx );
// 4.读取W25QXX的ID
uint16_t W25QxxReadID( W25QxxTypeDef* w25qxx );
// 5.获取W25QXX的状态寄存器
uint8_t W25QxxReadSR( W25QxxTypeDef* w25qxx );
// 6.写W25QXX的状态寄存器
void W25QxxWriteSR( W25QxxTypeDef* w25qxx, uint8_t sr );
// 7. W25QXX写使能
void W25QxxWriteEnable( W25QxxTypeDef* w25qxx );
// 8. W25QXX写禁止
void W25QxxWriteDisable( W25QxxTypeDef* w25qxx );
// 9. W25QXX读取数据
void W25QxxRead( W25QxxTypeDef* w25qxx, uint32_t addr, uint8_t* data, uint16_t len );
// 10.W25QXX写数据
uint8_t W25QxxWrite( W25QxxTypeDef* w25qxx, uint32_t addr, uint8_t* data, int16_t len );
// 11. W25QXX擦除整片
void W25QxxEraseChip( W25QxxTypeDef* w25qxx );
// 12. W25QXX擦除扇区
void W25QxxEraseSector( W25QxxTypeDef* w25qxx, uint32_t addr );
// 13. W25QXX进入掉电模式
void W25QxxPowerDown( W25QxxTypeDef* w25qxx );
// 14. W25QXX唤醒
void W25QxxWakeUp( W25QxxTypeDef* w25qxx );

/* 文件系统专用函数声明 */

uint16_t W25QxxReadIDInFileSystem( W25QxxTypeDef* w25qxx);
void W25QxxWaitBusyInFileSystem( W25QxxTypeDef* w25qxx );
void W25QxxWriteEnableInFileSystem( W25QxxTypeDef* w25qxx );
uint8_t W25QxxWritePageInFileSystem( W25QxxTypeDef* w25qxx, uint32_t addr, uint8_t* data, uint16_t len );
uint8_t W25QxxWriteNoCheckInFileSystem( W25QxxTypeDef* w25qxx, uint32_t addr, uint8_t* data, uint16_t len );
void W25QxxEraseSectorInFileSystem( W25QxxTypeDef* w25qxx, uint32_t addr );
void W25QxxPowerDownInFileSystem( W25QxxTypeDef* w25qxx );
void W25QxxWakeUpInFileSystem( W25QxxTypeDef* w25qxx );
void W25QxxReadInFileSystem( W25QxxTypeDef* w25qxx, uint32_t addr, uint8_t* data, uint16_t len );
uint8_t W25QxxWriteInFileSystem( W25QxxTypeDef* w25qxx, uint32_t addr, uint8_t* data, int16_t len );
void W25QxxEraseChipInFileSystem( W25QxxTypeDef* w25qxx );
uint8_t W25QxxReadSRInFileSystem( W25QxxTypeDef* w25qxx );
void W25QxxWriteSRInFileSystem( W25QxxTypeDef* w25qxx, uint8_t sr );





#endif // ! __W25QXX_H__
